﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel;

namespace Campus.Entities
{
    [Table("Estudiantes")]
    public class Estudiante
    {
        public int EstudianteId
        { 
            get; 
            set; 
        }
        
        [Required(ErrorMessage = "El {0} es requerido")]
        [StringLength(50, ErrorMessage = "El {0} no puede tener mas 50 caracteres")]
        public String Nombre
        {
            get;
            set;
        }
        
        [Required(ErrorMessage = "El {0} es requerido")]
        [StringLength(50, ErrorMessage = "El {0} no puede tener mas 50 caracteres")]
        public string Apellido
        {
            get;
            set;
        }

        
        public int DNI
        {
            get;
            set;
        }

        [DisplayName("Fecha de Nacimiento")]
        [Required(ErrorMessage = "La {0} es requerida")]
        [DataType(DataType.Date)]
        public DateTime FechaNacimiento
        {
            get;
            set;
        }

        public Byte[] Foto
        {
            get;
            set;
        }

        public bool Habilitado
        {
            get;
            set;
        }

        [DisplayName("Fecha de Ingreso")]
        [Required(ErrorMessage = "La {0} es requerida")]
        [DataType(DataType.Date)]
        public DateTime FechaIngreso
        {
            get;
            set;
        }

        [StringLength(50, ErrorMessage = "El {0} no puede tener mas 50 caracteres")]
        public string Email
        {
            get;
            set;
        }

        [DisplayName("Obra Social")]        
        public int ObraSocialId
        {
            get;
            set;
        }
        public virtual ObraSocial ObraSocial
        {
            get;
            set;
        }

        [DisplayName("Escuela")]
        [Required(ErrorMessage = "La {0} es requerida")]
        public int EscuelaId
        {
            get;
            set;
        }
        
        public virtual Escuela Escuela
        {
            get;
            set;
        }

        public int DocumentacionId
        {
            get;
            set;
        }

        public virtual Documentacion Documentacion
        {
            get;
            set;
        }
        [Required(ErrorMessage = "El {0} es requerido")]
        [DisplayName("Responsable")]
        public int ResponsableId
        {
            get;
            set;
        }
        public virtual Responsable Responsable
        {
            get;
            set;
        }

        public virtual ICollection<Pago> Pagos
        {
            get;
            set;
        }

        public virtual ICollection<Turno> Turnos
        {
            get;
            set;
        }

        public virtual ICollection<Grupo> Grupos
        {
            get;
            set;
        }
        [DisplayName("Cuota Mensual")]
        public float CuotaMensual
        {
            get;
            set;
        }

        [DisplayName("Cuota Anual")]        
        public float CuotaAnual
        {
            get;
            set;
        }


        
        [DisplayName("Total Adeudado")]
        [NotMapped]
        public double TotalAdeudado
        {
            get;
            set;
        }
        

        [NotMapped]
        public  string Apyn { 
             get {
                 return string.Format("{0}, {1}", this.Apellido, this.Nombre);             
             }                     
        }

        [Required(ErrorMessage = "El {0} es requerido")]        
        [Column("Estado")]
        public int EstadosEstudianteValor
        {
            get;
            set;
        }

        public EstadosEstudiante Estado
        {
            get {return (EstadosEstudiante) EstadosEstudianteValor; }
            set { EstadosEstudianteValor = (int) value ;}
        }

        public class EstadoEstudiante        
        {

            public int Valor { get; set; }
            public string Nombre { get; set; }            
        }

        public enum EstadosEstudiante
        {            
            Solicitud = 1,
            Inscripto = 2,
            Borrado = 3
        }

        #region Comportamiento

        /// <summary>
        /// Devuelve el pago mensual de un mes en particular pasado como parametro
        /// </summary>
        /// <param name="mes"></param>
        /// <returns></returns>
        public PagoMensual GetPagoMensual(int mes, bool incluirPagosEliminados)
        {            
                        
            List<PagoMensual> pagos = this.Pagos.Where(p => p.GetType().BaseType.Name == typeof(PagoMensual).Name && 
                                      (p as PagoMensual).Mes == mes && 
                                      (p as PagoMensual).FechaDePago.Year == DateTime.Now.Year)
                                      .Select(p => (p as PagoMensual)).ToList();

            if (!incluirPagosEliminados)
                pagos = pagos.Where(p => p.IsBorrado == false).ToList();

           if (pagos != null && pagos.Count > 0)
               return pagos[0];
           else
               return null;            
        }

        public PagoAnual GetPagoAnual(bool incluirPagosEliminados)
        {
            List<PagoAnual> pagos = this.Pagos.Where(p => p.GetType().BaseType.Name == typeof(PagoAnual).Name &&                                                          
                                      (p as PagoAnual).FechaDePago.Year == DateTime.Now.Year)
                                      .Select(p => (p as PagoAnual)).ToList();

            if (!incluirPagosEliminados)
                pagos = pagos.Where(p => p.IsBorrado == false).ToList();

            if (pagos != null && pagos.Count > 0)
                return pagos[0];
            else
                return null;
        }
        #endregion
    }
}
